package com.ato.IO;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * @author wangjing
 * @create 2021--12--09--20:46
 * 什么是IO   input output 输入输出流
 * 首先需要将File 类
 * 注意：以下的方法不涉及 读取  写入。用使用读取和写入 必须使用IO流了
 * 后续会将File类传入读取或者写入的IO流的类的参数中
 */
public class FileTest {
    @Test
    public void test1() {
//        new的时候，只是内存中有文件，不需要实际硬盘中有没有文件
        File file1 = new File("config.properties");// 相对于module
        File file2 = new File("C:\\Users\\wangjing\\Desktop\\javaFileTest.txt");//绝对路径：
//        第二种方法
        File file3 = new File("C:\\Users\\wangjing", "Desktop");
//        第3种方法  第一个参数数File类型，其实就是目录
        File file = new File(file3, "javaFileTest.text");
//  常用方法
//        1：获取绝对路径
        File absoluteFile = file2.getAbsoluteFile();
        System.out.println("absoluteFile: " + absoluteFile);
//        2：获取路径
        System.out.println("getPath: " + file2.getPath());
//        3：获取名称
        System.out.println("getName: " + file2.getName());
//          4:获取上层目录
        System.out.println("getParent: " + file2.getParent());
//        5：获取长度: 字节数
        System.out.println("length: " + file2.length());
//        6：获取最后一次修改时间：毫秒 Long
        System.out.println("lastModified: " + file2.lastModified());
        System.out.println("lastModified 通过new Date(lastModified) 查看: " + new Date(file2.lastModified()));

//        适用于文件目录
//        7：获取指定目录下的所有文件或者目录的名称的 数组
        String[] list = file3.list();
        for (String pathString : list) {

            System.out.println("指定目录下的文件的名称数组：" + pathString);
        }
//        8：获取指定目录下的所有文件或者目录的File数组
        File[] files = file3.listFiles();
        for (File file4 : files) {

            System.out.println("指定目录下的文件的数组 ： " + file4);
        }


    }

    @Test
    public void test2() {
        //      9:重命名：注意  1：源文件必须存在  2：目标文件不能存在  3:试了下 这个是把内容也一起复制了
        File file4 = new File("C:\\Users\\wangjing\\Desktop\\javaFileTest.txt");
        File file5 = new File("D:\\javacode\\01\\study-java\\renameTO.txt");
        boolean b = file4.renameTo(file5);
        System.out.println(b);

    }

    @Test
    public void test3() {
        File file = new File("renameTo.txt");
        //  10 ：是否为文件夹
        boolean isDirectory = file.isDirectory();
        System.out.println("isDirectory : " + isDirectory);

//        11：是否是文件

        boolean isFile = file.isFile();
        System.out.println("isFile : " + isFile);


//        12 是否存在
        boolean exists = file.exists();
        System.out.println("exists : " + exists);

//        13 是否可读
        boolean canRead = file.canRead();
        System.out.println("canRead :" + canRead);

//        14 是否可写
        boolean canWrite = file.canWrite();
        System.out.println("canWrite :" + canWrite);
//        15:是否隐藏
        boolean hidden = file.isHidden();
        System.out.println("hidden :" + hidden);


    }

    @Test
    public void test4() throws IOException {
//        创建文件  会有IOException 如果文件存在，则不创建  返回false
        File file = new File("renameTo1.txt");

        boolean createNewFile = file.createNewFile();
        System.out.println("createNewFile : " + createNewFile);



//        创建文件夹
//        mkdir ： 如果文件夹存在，则不创建  ，并且如果输入的是带有上层文件夹的，比如 C:\\xx\\xx2 xx不存在，那么也会失败
//        返回false
        File fileDir = new File("dir");
        boolean mkdir = fileDir.mkdir();
        System.out.println("mkdir : " + mkdir);
//      mkdirs 也是创建文件夹。如果上层目录不存在，也会一起创建
        File fileDir2 = new File("父级\\子级目录");
        boolean mkdirs = fileDir2.mkdirs();
        System.out.println("mkdirs  " + mkdirs);


//        删除文件或者文件夹。注意，删除不走回收站，删除文件夹时，不能删除非空的。和Liunx一样
        boolean delete = file.delete();
        System.out.println("delete文件 : " + delete);
        boolean delete1 = fileDir.delete();

        System.out.println("delete文件夹：不能有内容，需要为空 : " + delete1);

    }
}
